package com.monkeyboy.rabbitmq.direct;

import java.io.IOException;

import com.monkeyboy.rabbitmq.RabbitmqConnectionUtil;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;

/**
 * 作用： 消费者消费消息
 * 
 * @author Gavin
 * @time:2018年10月24日
 */
public class Consumer1 {
	public static void main(String[] args) throws Exception {
		// 获取到连接一级mq通道(相当于mysql获取连接)
		Connection connection = RabbitmqConnectionUtil.getConnection();
		// 从连接中创建通道(相当于mysql获取连接后还得获取到statement才能操作数据库一样的道理)
		Channel channel = connection.createChannel();

		// 声明
		String exchangeName = "test_direct_exchange";
		String queueName = "test_direct_queue";
		String routingKey = "test.direct";

		// 声明（创建）队列【相当于mysql数据库中的表，用来存数据】(用来接受消息，生产者---》发送消息到队列《------消费者消费消息)
		channel.queueDeclare(queueName, false, false, false, null);

		// 绑定队列到交换机
		channel.queueBind(queueName, exchangeName, routingKey);
		// 创建消费者
		DefaultConsumer consumer = new DefaultConsumer(channel) {

			@Override
			public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
					throws IOException {
				// TODO Auto-generated method stub
				super.handleDelivery(consumerTag, envelope, properties, body);

				// 获取消息（如果没有消息，这一步将会一直阻塞）
				String message = new String(body);
				System.out.println("消费者接受到消息" + message);
				// envelope这个对象很重要，可以用来处理消息的唯一性，接受消息处理的时候很重要
				System.out.println("envelopeTag--->" + envelope.getDeliveryTag());
			}

		};
		// 同一时刻服务器只会发一条消息给消费者
		channel.basicQos(1);
		// channel监听队列，并自动ACK
		boolean autoAck = true;
		channel.basicConsume(queueName, autoAck, consumer);
	}
}
